package com.zhongge.stackOJ;

import java.util.Stack;

/**
 * @ClassName RePolishExpressionsEvaluation
 * @Description TODO 逆波兰表达式求值
 * @Author 笨忠
 * @Date 2025/8/23 16:35
 * @Version 1.0
 */
public class RePolishExpressionsEvaluation {
    /**
     * @param tokens 逆波兰表达式
     * @return 根据逆波兰表达式所求的值
     */
    public int evalRPN(String[] tokens) {
        //第一步需要辅助栈
        Stack<Integer> stack = new Stack<>();
        for (String s: tokens) {
            //如果是数字就直接入栈(写一个辅助函数用于判断是运算符还是数字)
            if (!isOperator(s)){//如果(不是运算符)是数字，就入栈
                stack.push(Integer.parseInt(s));
            } else {//如果是运算符，就出两次栈
                int num1 = stack.pop();
                int num2 = stack.pop();

                switch (s) {
                    case "+":
                        //取出栈顶两个元素
                        //第一次放右边，第二次放左边
                        //然后将结果入栈
                        stack.push(num2 + num1);
                        break;
                    case "-":
                        stack.push(num2 - num1);
                        break;
                    case "*":
                        stack.push(num2 * num1);
                        break;
                    case "/":
                        stack.push(num2 / num1);
                        break;
                }
            }
        }
        //当逆波兰表达式遍历完毕后 栈中所剩下的这个值就是结果
        return stack.pop();
    }

    private boolean isOperator(String s) {
        if (s.equals("+") || s.equals("-") ||
                s.equals("*") || s.equals("/")) {
            return true;//是运算符就返回true
        } else {
            return false;//是数字就返回false
        }
    }
}
